import {
  getNewCartGoodes,
  mergeLocalCart,
  getCartList,
  postJoinCart,
  putCartItem,
  deleteCartItem,
  putSeleteds
} from '@/api/cart.js'
export default {
  namespaced: true,
  state() {
    return {
      list: [] // 购物车列表
    }
  },
  mutations: {
    // 本地购物车添加操作
    insertCart(state, goods) {
      // 如果购物车中已经存在想同规格的商品(skuid),数量累加
      // 更新数量，或者添加新的商品，放最前面
      // 逻辑：判断是否有相同规格的商品，有就用findIndex获取下标，合并最新数量后删除旧的商品规格
      const index = state.list.findIndex(item => item.skuId === goods.skuId)
      if (index >= 0) {
        goods.count = state.list[index].count + goods.count
        state.list.splice(index, 1)
      }
      // 不管有没有重复规格的商品都把最新的商品放最前面
      state.list.unshift(goods)
    },
    // 线下购物车删除操作
    deleteCartList(state, skuId) {
      const index = state.list.findIndex(item => item.skuId === skuId)
      state.list.splice(index, 1)
    },
    // 本地购物车更新数据
    upDataCart(state, goods) {
      // 目前: 支持购物车数据更新:goods={ nowPrice,stock,isEffective }
      // 将来:支持修改勾选状态,goods={selected:true|false}
      // 将来:支持修改数量,goods={count:数量}
      // 每次传的值都会有skuId
      const updataGoods = state.list.find(item => item.skuId === goods.skuId) // 找到数据更新的商品
      for (const key in goods) {
        const value = goods[key] // 拿到要修改的值
        if (value !== null && value !== '' && value !== undefined) {
          updataGoods[key] = value
        }
      }
    },
    setList(state, arr) {
      state.list = arr
    }
  },
  actions: {
    // 线上|线下，添加购物车
    async insertCart(ctx, goods) {
      const token = ctx.rootState.user.profile.token
      if (token) {
        // 已登录：调用后台接口更新数据
        const { skuId, count } = goods
        const data = await postJoinCart({ skuId, count })
        ctx.commit('insertCart', data.result)
      } else {
        // 未登录：调用mutation中的方法存本地
        ctx.commit('insertCart', goods)
      }
    },
    // 线上|线下，更新购物车
    async getCartList(ctx) {
      const token = ctx.rootState.user.profile.token
      if (token) {
        // 已登录,获取购物车列表
        const data = await getCartList()
        ctx.commit('setList', data.result)
      } else {
        // 未登录
        // 每个商品都需要更新，都需要调用接口，并发请求
        const promiseAll = ctx.state.list.map(item => getNewCartGoodes(item.skuId))
        const data = await Promise.all(promiseAll)
        data.forEach((item, i) => {
          ctx.commit('upDataCart', { skuId: ctx.state.list[i].skuId, ...item.result })
        })
      }
    },
    // 线上|线下，删除购物车
    async delCartList(ctx, skuId) {
      const token = ctx.rootState.user.profile.token
      if (token) {
        // 已登录：调用后台接口更新数据
        await deleteCartItem([skuId])
        await ctx.dispatch('getCartList')
      } else {
        // 未登录
        ctx.commit('deleteCartList', skuId)
      }
    },
    // 线上|线下，单选按钮的控制
    async radioBoxList(ctx, goods) {
      const token = ctx.rootState.user.profile.token
      if (token) {
        // 已登录：调用后台接口更新数据
        const { result } = await putCartItem(goods.skuId, { selected: goods.selected })
        ctx.commit('upDataCart', { skuId: result.skuId, selected: result.selected })
      } else {
        // 未登录
        ctx.commit('upDataCart', goods)
      }
    },
    // 线上|线下，多选按钮的控制
    async checkboxList(ctx, selected) {
      const token = ctx.rootState.user.profile.token
      if (token) {
        // 已登录：调用后台接口更新数据
        const ids = ctx.getters.validList.map(item => item.skuId)
        await putSeleteds({ ids, selected })
        await ctx.dispatch('getCartList')
      } else {
        // 未登录
        ctx.getters.validList.forEach(item => {
          ctx.commit('upDataCart', { skuId: item.skuId, selected })
        })
      }
    },
    // 线上|线下购物车 修改数量
    async countNumber(ctx, goods) {
      const token = ctx.rootState.user.profile.token
      if (token) {
        console.log(goods)
        // 已登录：调用后台接口更新数据
        const { result } = await putCartItem(goods.skuId, { count: goods.count })
        ctx.commit('upDataCart', { skuId: result.skuId, count: result.count })
      } else {
        ctx.commit('upDataCart', { skuId: goods.skuId, count: goods.count })
      }
    },
    // 合并购物车
    async mergCart(ctx) {
      const merg = ctx.getters.validList.map(item => {
        return { skuId: item.skuId, count: item.count, selected: item.selected }
      })
      await mergeLocalCart(merg)
      ctx.commit('setList', [])
    }
  },
  getters: {
    // 有效商品列表
    validList(state) {
      return state.list.filter(item => item.isEffective && item.stock)
    },
    // 有效商品总件数
    validCount(state, getters) {
      // p:上次的计算结果，c：为遍历的每一项，一般上一次的结果都是从0开始
      return getters.validList.reduce((p, c) => p + c.count, 0)
    },
    // 有效商品总金额
    validMoney(state, getters) {
      return getters.validList.reduce((p, c) => p + c.nowPrice * 100 * c.count, 0) / 100
    },
    checkBoxList(state, getters) {
      return getters.validList.every(item => item.selected === true)
    }
  }
}
